﻿//给你一个由 '1'（陆地）和 '0'（水）组成的的二维网格，请你计算网格中岛屿的数量。
//岛屿总是被水包围，并且每座岛屿只能由水平方向和 / 或竖直方向上相邻的陆地连接形成。
//此外，你可以假设该网格的四条边均被水包围。
//
//输入：grid = [
//	["1", "1", "1", "1", "0"],
//		["1", "1", "0", "1", "0"],
//		["1", "1", "0", "0", "0"],
//		["0", "0", "0", "0", "0"]
//]
//输出：1
//
//输入：grid = [
//	["1", "1", "0", "0", "0"],
//		["1", "1", "0", "0", "0"],
//		["0", "0", "1", "0", "0"],
//		["0", "0", "0", "1", "1"]
//]
//输出：3
//
//提示：
//	m == grid.length
//	n == grid[i].length
//	1 <= m, n <= 300
//	grid[i][j] 的值为 '0' 或 '1'

    class Solution {
    int dx[4] = { 1, -1, 0, 0 };
    int dy[4] = { 0, 0, 1, -1 };
    bool vis[301][301];
    int m, n;

    public:
        int numIslands(vector<vector<char>>& grid) {
            m = grid.size(), n = grid[0].size();
            int ret = 0;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (grid[i][j] == '1' && !vis[i][j]) {
                        ret++;
                        bfs(grid, i, j); // 把这块陆地全部标记⼀下
                    }
                }
            }
            return ret;
        }
        void bfs(vector<vector<char>>& grid, int i, int j) {
            queue<pair<int, int>> q;
            q.push({ i, j });
            vis[i][j] = true;
            while (q.size()) {
                auto [a, b] = q.front();
                q.pop();
                for (int k = 0; k < 4; k++) {
                    int x = a + dx[k], y = b + dy[k];
                    if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' &&
                        !vis[x][y]) {
                        q.push({ x, y });
                        vis[x][y] = true;
                    }
                }
            }
        }
};